/**
 * @file Performance_Test_Example.c
 * @brief OLED性能测试示例代码
 * @note 此文件展示如何测试OLED优化效果，仅供参考
 */

#include "gd32f470vet6_bsp.h"

/**
 * @brief 性能测试函数 - 清屏操作
 * @note 测试OLED_Clear()函数的性能提升
 */
void Test_OLED_Clear_Performance(void)
{
    uint32_t start_time, end_time, duration;
    
    // 记录开始时间
    start_time = uwTick;
    
    // 执行清屏操作
    OLED_Clear();
    
    // 记录结束时间
    end_time = uwTick;
    duration = end_time - start_time;
    
    // 输出测试结果
    Usart0Printf("OLED_Clear() 执行时间: %d ms\r\n", duration);
    
    // 优化前预期时间: ~100-200ms
    // 优化后预期时间: ~1-5ms
    // 性能提升: 20-200倍
}

/**
 * @brief 性能测试函数 - 字符串显示
 * @note 测试字符串显示的性能提升
 */
void Test_OLED_String_Performance(void)
{
    uint32_t start_time, end_time, duration;
    const char* test_string = "Hello OLED Optimization!";
    
    // 记录开始时间
    start_time = uwTick;
    
    // 执行字符串显示
    OLED_ShowStr(0, 0, (char*)test_string, 16);
    
    // 记录结束时间
    end_time = uwTick;
    duration = end_time - start_time;
    
    // 输出测试结果
    Usart0Printf("字符串显示执行时间: %d ms\r\n", duration);
    
    // 优化前预期时间: ~50-100ms
    // 优化后预期时间: ~10-20ms
    // 性能提升: 3-5倍
}

/**
 * @brief 性能测试函数 - 填充操作
 * @note 测试OLED_Allfill()函数的性能提升
 */
void Test_OLED_Fill_Performance(void)
{
    uint32_t start_time, end_time, duration;
    
    // 记录开始时间
    start_time = uwTick;
    
    // 执行填充操作
    OLED_Allfill();
    
    // 记录结束时间
    end_time = uwTick;
    duration = end_time - start_time;
    
    // 输出测试结果
    Usart0Printf("OLED_Allfill() 执行时间: %d ms\r\n", duration);
    
    // 优化前预期时间: ~100-200ms
    // 优化后预期时间: ~1-5ms
    // 性能提升: 20-200倍
}

/**
 * @brief 性能测试函数 - 数字显示
 * @note 测试数字显示的性能
 */
void Test_OLED_Number_Performance(void)
{
    uint32_t start_time, end_time, duration;
    float test_voltage = 3.14f;
    
    // 记录开始时间
    start_time = uwTick;
    
    // 执行数字显示（通过OledDrawStr）
    OledDrawStr(0, 2, "Voltage: %.2fV", test_voltage);
    
    // 记录结束时间
    end_time = uwTick;
    duration = end_time - start_time;
    
    // 输出测试结果
    Usart0Printf("数字显示执行时间: %d ms\r\n", duration);
    
    // 优化前预期时间: ~30-60ms
    // 优化后预期时间: ~8-15ms
    // 性能提升: 3-5倍
}

/**
 * @brief 综合性能测试函数
 * @note 执行所有性能测试并输出结果
 */
void Run_OLED_Performance_Tests(void)
{
    Usart0Printf("\r\n=== OLED性能优化测试开始 ===\r\n");
    
    // 初始化OLED
    OLED_Init();
    delay_1ms(100);
    
    // 测试1: 清屏性能
    Usart0Printf("\r\n[测试1] 清屏操作性能测试:\r\n");
    Test_OLED_Clear_Performance();
    delay_1ms(500);
    
    // 测试2: 字符串显示性能
    Usart0Printf("\r\n[测试2] 字符串显示性能测试:\r\n");
    Test_OLED_String_Performance();
    delay_1ms(500);
    
    // 测试3: 填充操作性能
    Usart0Printf("\r\n[测试3] 填充操作性能测试:\r\n");
    Test_OLED_Fill_Performance();
    delay_1ms(500);
    
    // 测试4: 数字显示性能
    Usart0Printf("\r\n[测试4] 数字显示性能测试:\r\n");
    Test_OLED_Number_Performance();
    delay_1ms(500);
    
    Usart0Printf("\r\n=== OLED性能优化测试完成 ===\r\n");
    
    // 显示测试完成信息
    OLED_Clear();
    OLED_ShowStr(0, 0, "Performance Test", 16);
    OLED_ShowStr(0, 2, "Completed!", 16);
}

/**
 * @brief 兼容性测试函数
 * @note 验证应用层代码的兼容性
 */
void Test_Application_Compatibility(void)
{
    Usart0Printf("\r\n=== 应用层兼容性测试 ===\r\n");
    
    // 测试原有的应用层函数
    OledTask(); // 调用原有的OLED任务函数
    
    // 测试各种显示场景
    OLED_Clear();
    OLED_ShowStr(0, 0, "Compatibility", 16);
    OLED_ShowStr(0, 2, "Test OK!", 16);
    
    // 测试数字显示
    OLED_ShowNum(80, 0, 123, 3, 16);
    OLED_ShowFloat(80, 2, 3.14f, 2, 16);
    
    Usart0Printf("应用层兼容性测试通过!\r\n");
}

/**
 * @brief 内存使用情况检查
 * @note 检查优化后的内存使用情况
 */
void Check_Memory_Usage(void)
{
    Usart0Printf("\r\n=== 内存使用情况检查 ===\r\n");
    
    // 输出新增内存使用情况
    Usart0Printf("批量传输缓冲区: %d 字节\r\n", sizeof(oled_batch_buffer));
    Usart0Printf("缓冲区索引变量: %d 字节\r\n", sizeof(oled_buffer_index));
    Usart0Printf("缓冲区阈值变量: %d 字节\r\n", sizeof(oled_buffer_threshold));
    
    // 计算总的新增内存
    uint16_t total_memory = sizeof(oled_batch_buffer) + 
                           sizeof(oled_buffer_index) + 
                           sizeof(oled_buffer_threshold) + 4; // oled_last_write_time
    
    Usart0Printf("总新增内存使用: %d 字节\r\n", total_memory);
    
    // 检查缓冲区状态
    Usart0Printf("当前缓冲区索引: %d\r\n", oled_buffer_index);
    Usart0Printf("缓冲区刷新阈值: %d\r\n", oled_buffer_threshold);
    
    Usart0Printf("内存使用检查完成!\r\n");
}

/* 使用示例：
 * 
 * 在main函数或适当的地方调用：
 * 
 * int main(void)
 * {
 *     SysInit();
 *     
 *     // 运行性能测试
 *     Run_OLED_Performance_Tests();
 *     
 *     // 测试兼容性
 *     Test_Application_Compatibility();
 *     
 *     // 检查内存使用
 *     Check_Memory_Usage();
 *     
 *     while(1)
 *     {
 *         TaskExecution();
 *     }
 * }
 */
